﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanLyHocPhi.GUI.DuLieu;
using QuanLyHocPhi.Model;
using QuanLyHocPhi.BLL;
using System.IO;

namespace QuanLyHocPhi.GUI.TacNghiep
{

    public partial class ChiTietPhieuThu : FormBaseDialog
    {
        PhieuThu phieuThu = null;
        SinhVien sinhVien = null;
        string maLopHocPhan = "";
        string fileName = "";
        public ChiTietPhieuThu()
        {
            fileName = string.Format("{0}\\TEMPLATES\\MauPhieuThu.doc",
                   "D:\\");
            InitializeComponent();
        }

        public ChiTietPhieuThu(PhieuThu phieuThu)
        {
            this.phieuThu = phieuThu;
            fileName = string.Format("{0}\\TEMPLATES\\MauPhieuThu.doc",
                "D:\\");
            InitializeComponent();
        }

        public ChiTietPhieuThu(SinhVien sinhVien, string maLopHocPhan)
        {
            fileName = string.Format("{0}\\TEMPLATES\\MauPhieuThu.doc",
                "D:\\");
            this.sinhVien = sinhVien;
            this.maLopHocPhan = maLopHocPhan;
            InitializeComponent();
        }

        private void ChiTietPhieuThu_Load(object sender, EventArgs e)
        {
            if (phieuThu != null)
            {
                //Chỉnh sửa phiếu thu
                txtQuyenSo.Text = phieuThu.QuyenSo;
                txtSoPhieuThu.Text = phieuThu.SoPhieuThu;
                var lopHPSV = BizSinhVien.GetLopHocPhan_SinhVien(phieuThu.MaSinhVien, phieuThu.KC_MaLopHocPhan);
                if (lopHPSV != null)
                    txtMienGiam.Text = lopHPSV.HeSoMienGiam.ToString();
                txtNoiDungThu.Text = phieuThu.NoiDungThu;
                //txtNoiDungThu.Text = string.Format("Thu học phí học kỳ {0} năm học {1}", lopHPSV.LopHocPhan.HocKy.SoHieuHocKy.ToString(), lopHPSV.LopHocPhan.HocKy.NamHoc);
                decimal hp = lopHPSV.LopHocPhan.HocPhi + lopHPSV.LopHocPhan.PhuThu;
                txtHocPhi.Text = hp.ToString();
                lbTongtien.Text = phieuThu.SoTien.ToString().FormatCurrency();
                lbTongTienBangChu.Text = phieuThu.SoTien.ToString().ConvertNum2Text();
                lbNguoiLap.Visible = true;
                var nguoiLap = BizNguoiSuDung.GetNguoiSuDung(phieuThu.TenDangNhap);
                lbNguoiLap.Text = "Người lập:                     " + nguoiLap.HoVaTen;

                ngayThu.Value = phieuThu.NgayThu;
                if (Program.NguoiSuDung.VaiTro == 0)
                {
                    panelChiTiet.Enabled = false;
                    bntLuu.Enabled = false;
                    bntInPhieuThu.Text = "In";
                    btnNapDuLieu.Visible = false;
                }
                else
                {
                    panelChiTiet.Enabled = true;
                    bntLuu.Enabled = true;
                    bntInPhieuThu.Text = "Lưu và in";
                    btnNapDuLieu.Visible = true;
                    btnNapDuLieu.Focus();
                }

            }
            else if (sinhVien != null)
            {
                //Thêm mới phiếu thu
                btnNapDuLieu.Visible = false;
                var cauHinh = BizNguoiSuDung.GetNguoiSuDung("cauhinh");
                if (cauHinh == null)
                {
                    NguoiSuDung user = new NguoiSuDung();
                    user.TenDangNhap = "cauhinh";
                    user.VaiTro = 2;
                    user.MatKhau = "1;1";
                    user.HoVaTen = "Cấu hình hệ thống";
                    cauHinh = user;
                    BizNguoiSuDung.ThemMoi(user);
                }
                var thongtin = cauHinh.MatKhau.Split(new string[] { ";" }, StringSplitOptions.None);
                if (thongtin.Length == 2)
                {
                    long result = 0;
                    if (long.TryParse(thongtin[0], out result))
                    {
                        txtQuyenSo.Text = thongtin[0];
                        if (long.TryParse(thongtin[1], out result))
                            txtSoPhieuThu.Text = thongtin[1];
                    }
                    else
                    {
                        txtQuyenSo.Text = "1";
                        txtSoPhieuThu.Text = "1";
                    }
                }
                //txtNoiDungThu.Text = "Thu học phí";

                if (true)//sinhVien.MaLoai == (int)LoaiSinhVien.SinhVienKhongChuyen)
                {
                    var lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                    txtMienGiam.Text = lopHP_SV.HeSoMienGiam.ToString();
                    txtHocPhi.Text = (lopHP_SV.LopHocPhan.HocPhi + lopHP_SV.LopHocPhan.PhuThu).ToString();
                    txtNoiDungThu.Text = string.Format("Thu học phí học kỳ {0} năm học {1}", lopHP_SV.LopHocPhan.HocKy.SoHieuHocKy.ToString(), lopHP_SV.LopHocPhan.HocKy.NamHoc);
                }
                //else
                //{
                //    var lopHP_SV = BizSinhVien.GetLopHPCN_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                //    txtMienGiam.Text = lopHP_SV.HeSoMienGiam.ToString();
                //    txtHocPhi.Text = (lopHP_SV.LopHocPhanChuyenNganh.HocPhi + lopHP_SV.LopHocPhanChuyenNganh.PhuThu).ToString();
                //}
            }
        }

        private void bntLuu_Click(object sender, EventArgs e)
        {
            #region Kiểm tra tính hợp lệ của dữ liệu
            thongBaoLoi.Clear();

            if (string.IsNullOrEmpty(txtQuyenSo.Text))
            {
                thongBaoLoi.SetError(txtQuyenSo, "Bạn chưa nhập quyển số");
                txtQuyenSo.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtSoPhieuThu.Text))
            {
                thongBaoLoi.SetError(txtSoPhieuThu, "Bạn chưa nhập số phiếu thu");
                txtSoPhieuThu.Focus();
                return;
            }
            if (string.IsNullOrEmpty(txtNoiDungThu.Text))
            {
                thongBaoLoi.SetError(txtNoiDungThu, "Bạn chưa nhập nội dung thu");
                txtNoiDungThu.Focus();
                return;
            }
            decimal re = 0;
            if (!decimal.TryParse(txtMienGiam.Text, out re))
            {
                MessageBox.Show("Hệ số miễn giảm không hợp lệ");
                return;
            }
            //if (decimal.Parse(txtMienGiam.Text) == 1)
            //{
            //    MessageBox.Show("Được miễn học phí");
            //    return;
            //}
            if (decimal.Parse(txtMienGiam.Text) > 1 || decimal.Parse(txtMienGiam.Text) < 0)
            {
                MessageBox.Show("Hệ số miễn giảm không hợp lệ");
                return;
            }
            #endregion

            if (phieuThu != null)
            {
                //Cập nhật
                phieuThu.QuyenSo = txtQuyenSo.Text;
                phieuThu.SoPhieuThu = txtSoPhieuThu.Text;
                phieuThu.NoiDungThu = txtNoiDungThu.Text;
                phieuThu.NgayThu = ngayThu.Value;
                phieuThu.SoTien = decimal.Parse(lbTongtien.Text.Replace(".", "").Replace(",", ""));
                BizPhieuThu.UpdatePhieuThu(phieuThu);
                var lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(phieuThu.MaSinhVien, phieuThu.KC_MaLopHocPhan);
                lopHP_SV.HeSoMienGiam = double.Parse(txtMienGiam.Text);
                BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(lopHP_SV);
            }
            else if (sinhVien != null)
            {
                if (decimal.Parse(txtMienGiam.Text) == 1)
                {
                    var lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                    lopHP_SV.HeSoMienGiam = 1;
                    BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(lopHP_SV);
                    this.Close();
                    return;
                }
                //Thêm mới
                var pt = new PhieuThu
                {
                    MaPhieuThu = Guid.NewGuid().ToString(),
                    MaSinhVien = sinhVien.MaSinhVien,
                    NgayThu = ngayThu.Value,
                    NoiDungThu = txtNoiDungThu.Text,
                    QuyenSo = txtQuyenSo.Text,
                    SoPhieuThu = txtSoPhieuThu.Text,
                    SoTien = decimal.Parse(lbTongtien.Text.Replace(".", "").Replace(",", "")),
                    TenDangNhap = Program.NguoiSuDung.TenDangNhap
                };
                pt.KC_MaLopHocPhan = maLopHocPhan;
                try
                {
                    if (BizPhieuThu.AddNew_PhieuThu(pt))
                    {
                        var cauHinh = BizNguoiSuDung.GetNguoiSuDung("cauhinh");
                        try
                        {
                            long quyenso = long.Parse(txtQuyenSo.Text);
                            long soPhieu = long.Parse(txtSoPhieuThu.Text);
                            if (soPhieu % 50 == 0)
                                quyenso += 1;
                            soPhieu += 1;
                            BizNguoiSuDung.DoiMatKhau(cauHinh, quyenso.ToString() + ";" + soPhieu.ToString());
                        }
                        catch
                        {
                            BizNguoiSuDung.DoiMatKhau(cauHinh, "1;1");
                        }
                        var lopHPSV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                        lopHPSV.MaPhieuThu = pt.MaPhieuThu;
                        lopHPSV.HeSoMienGiam = double.Parse(txtMienGiam.Text);
                        BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(lopHPSV);
                    }
                    else
                        MessageBox.Show("Lỗi rồi");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
            this.Close();
        }

        private void bntDong_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        void TongTien()
        {
            var tong = 0M;
            decimal temp = 0M;
            decimal mienGiam = 0;
            if (decimal.TryParse(txtHocPhi.Text, out temp))
                tong = decimal.Parse(txtHocPhi.Text);
            if (decimal.TryParse(txtMienGiam.Text, out temp))
                mienGiam = decimal.Parse(txtMienGiam.Text);
            tong = tong - tong * mienGiam;
            tong = Math.Round(tong, 0);
            lbTongtien.Text = tong.ToString().FormatCurrency();
            lbTongTienBangChu.Text = tong.ToString().ConvertNum2Text();
        }

        private void txtHocPhi_TextChanged(object sender, EventArgs e)
        {
            TongTien();
        }

        private void bntInPhieuThu_Click(object sender, EventArgs e)
        {
            #region Kiểm tra tính hợp lệ của dữ liệu
            thongBaoLoi.Clear();
            decimal re = 0;
            if (!decimal.TryParse(txtMienGiam.Text, out re))
            {
                MessageBox.Show("Hệ số miễn giảm không hợp lệ");
                return;
            }
            if (decimal.Parse(txtMienGiam.Text) == 1)
            {
                MessageBox.Show("Được miễn học phí");
                return;
            }
            if (decimal.Parse(txtMienGiam.Text) > 1 || decimal.Parse(txtMienGiam.Text) < 0)
            {
                MessageBox.Show("Hệ số miễn giảm không hợp lệ");
                return;
            }
            if (string.IsNullOrEmpty(txtQuyenSo.Text))
            {
                thongBaoLoi.SetError(txtQuyenSo, "Bạn chưa nhập quyển số");
                return;
            }
            if (string.IsNullOrEmpty(txtSoPhieuThu.Text))
            {
                thongBaoLoi.SetError(txtSoPhieuThu, "Bạn chưa nhập số phiếu thu");
                return;
            }
            if (string.IsNullOrEmpty(txtNoiDungThu.Text))
            {
                thongBaoLoi.SetError(txtNoiDungThu, "Bạn chưa nhập nội dung thu");
                return;
            }
            #endregion

            if (phieuThu != null)
            {
                //Cập nhật
                phieuThu.QuyenSo = txtQuyenSo.Text;
                phieuThu.SoPhieuThu = txtSoPhieuThu.Text;
                phieuThu.NoiDungThu = txtNoiDungThu.Text;
                phieuThu.NgayThu = ngayThu.Value;
                phieuThu.SoTien = decimal.Parse(lbTongtien.Text.Replace(".", "").Replace(",", ""));
                BizPhieuThu.UpdatePhieuThu(phieuThu);
                var lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(phieuThu.MaSinhVien, phieuThu.KC_MaLopHocPhan);
                lopHP_SV.HeSoMienGiam = double.Parse(txtMienGiam.Text);
                BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(lopHP_SV);
                if (!File.Exists(fileName))
                {
                    fileName = OpenDialog();
                }
                if (!File.Exists(fileName))
                    return;
                FillDataPhieuThu();
            }
            else
            {
                //Thêm mới
                var pt = new PhieuThu
                {
                    MaPhieuThu = Guid.NewGuid().ToString(),
                    MaSinhVien = sinhVien.MaSinhVien,
                    NgayThu = ngayThu.Value,
                    NoiDungThu = txtNoiDungThu.Text,
                    QuyenSo = txtQuyenSo.Text,
                    SoPhieuThu = txtSoPhieuThu.Text,
                    SoTien = decimal.Parse(lbTongtien.Text.Replace(".", "").Replace(",", "")),
                    TenDangNhap = Program.NguoiSuDung.TenDangNhap
                };
                if (true)//sinhVien.MaLoai == (int)LoaiSinhVien.SinhVienKhongChuyen)
                {
                    pt.KC_MaLopHocPhan = maLopHocPhan;
                }
                //else
                //{
                //    pt.C_MaLopHocPhanChuyenNganh = maLopHocPhan;
                //}
                if (BizPhieuThu.AddNew_PhieuThu(pt))
                {
                    var cauHinh = BizNguoiSuDung.GetNguoiSuDung("cauhinh");
                    try
                    {
                        long quyenso = long.Parse(txtQuyenSo.Text);
                        long soPhieu = long.Parse(txtSoPhieuThu.Text);
                        if (soPhieu % 50 == 0)
                            quyenso += 1;
                        soPhieu += 1;
                        BizNguoiSuDung.DoiMatKhau(cauHinh, quyenso.ToString() + ";" + soPhieu.ToString());
                    }
                    catch
                    {
                        BizNguoiSuDung.DoiMatKhau(cauHinh, "1;1");
                    }
                    if (true)//sinhVien.MaLoai == (int)LoaiSinhVien.SinhVienKhongChuyen)
                    {
                        var lopHP_SV = BizSinhVien.GetLopHocPhan_SinhVien(sinhVien.MaSinhVien, maLopHocPhan);
                        lopHP_SV.MaPhieuThu = pt.MaPhieuThu;
                        lopHP_SV.HeSoMienGiam = double.Parse(txtMienGiam.Text);
                        BizPhieuThu.Update_LopHocPhan_SinhVienKhongChuyen(lopHP_SV);
                    }
                    phieuThu = pt;
                    phieuThu.SinhVien = sinhVien;
                    if (!File.Exists(fileName))
                    {
                        fileName = OpenDialog();
                    }
                    if (!File.Exists(fileName))
                        return;
                    FillDataPhieuThu();
                }
                else
                    MessageBox.Show("Lỗi lưu dữ liệu");
            }
            this.Close();
        }

        void FillDataPhieuThu()
        {
            FormProgress frm = new FormProgress();
            frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
                              {
                                  using (WordUltities word = new WordUltities(fileName))
                                  {
                                      word.OpenDocument();
                                      //Điền dữ liệu tại đây
                                      if (phieuThu != null)
                                      {
                                          var ngayThu = string.Format("{0:dd/MM/yyyy}", phieuThu.NgayThu);
                                          word.ReplaceText("quyenSo", phieuThu.QuyenSo);
                                          word.ReplaceText("soPhieuThu", phieuThu.SoPhieuThu);
                                          word.ReplaceText("ngay", phieuThu.NgayThu.Day.ToString());
                                          word.ReplaceText("thang", phieuThu.NgayThu.Month.ToString());
                                          word.ReplaceText("nam", phieuThu.NgayThu.Year.ToString());
                                          word.ReplaceText("ngayThu", ngayThu.DateToText());
                                          word.ReplaceText("tenSinhVien",
                                                           phieuThu.SinhVien.HoDem.Trim() + " " +
                                                           phieuThu.SinhVien.Ten.Trim());
                                          var lopGoc = BizLopGoc.GetLopByMaLop(phieuThu.SinhVien.KC_MaLop);
                                          var lopHP = BizLopHocPhan.GetLopHocPhanByMaLHP(phieuThu.KC_MaLopHocPhan);
                                          var diaChi = lopGoc != null ? lopGoc.TenLop : "";
                                          diaChi += " - " + lopHP.TenLopHocPhan;
                                          word.ReplaceText("diaChi", diaChi);
                                          word.ReplaceText("noiDungThu", phieuThu.NoiDungThu);
                                          word.ReplaceText("soTienThu", phieuThu.SoTien.ToString().FormatCurrency());
                                          word.ReplaceText("soTienBangChu",
                                                           phieuThu.SoTien.ToString().ConvertNum2Text().Trim());
                                          word.ReplaceText("nguoiThuTien", Program.NguoiSuDung.HoVaTen);
                                          word.ReplaceText("<<", "");
                                          word.ReplaceText(">>", "");
                                          word.PrintDocument();
                                      }
                                  }
                              };
            frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
                                          {
                                              if (oE.Error != null)
                                              {
                                                  string msg = oE.Error.Message;
                                                  if (oE.Error.InnerException != null)
                                                      msg += oE.Error.InnerException.Message;
                                                  DialogUtils.ShowError(msg);
                                              }

                                          };
            frm.StartWorking(this);
        }

        private void txtQuyenSo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                bntLuu_Click(sender, e);
            }
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
            {
                e.Handled = true;
            }

        }

        string OpenDialog()
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.InitialDirectory = "c:\\";
            fileDialog.Filter = "File word (*.doc, *.docx)|*.doc;*.docx";
            fileDialog.FilterIndex = 2;
            fileDialog.RestoreDirectory = true;
            fileDialog.Title = "Vui lòng chọn mẫu phiếu thu";
            if (fileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                return fileDialog.FileName;
            }
            return "";
        }

        private void txtNoiDungThu_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13)
            {
                bntLuu_Click(sender, e);
            }
        }

        private void txtQuyenSo_TextChanged(object sender, EventArgs e)
        {

        }

        private void btnNapDuLieu_Click(object sender, EventArgs e)
        {
            txtHocPhi_TextChanged(sender, e);
        }

        private void txtMienGiam_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "[0-9]*[.][0-9]*"))
            //{
            //    e.Handled = true;
            //}
            if (e.KeyChar == (char)13)
            {
                bntLuu_Click(sender, e);
            }
        }

        private void txtMienGiam_TextChanged(object sender, EventArgs e)
        {
            TongTien();
        }
    }
}
